/**
 * @file BaseFormat.hpp
 * @brief 文件格式基类，所有的文件格式均需包含该文件
 * @note
 * **文件格式编写要求**
 * - 应该将源文件放在`FileFormat`目录下
 * - 在`main()`函数中，向`ControlCollege`注册类型
 * - 文件格式应该继承于`BaseFormat`，并且重写所有虚函数，要求实现所定义的语义
 */

#ifndef BASE_FORMAT_H
#define BASE_FORMAT_H

#include <filesystem>
#include "../ImageType.hpp"
#include "../CameraDriver/Base/Camera.hpp"

/**
 * @class BaseFormatAdditionalInf
 * @brief 附加信息
 */
struct BaseFormatAdditionalInf
{
  /**
   * @brief 图片宽度
   */
  unsigned long imgWidth;
  /**
   * @brief 图片高度
   */
  unsigned long imgHeight;
  /**
   * @brief 像素格式
   */
  BaseCamera::ImageType pixelType;
  /**
   * @brief 相机UUID
   */
  std::string CameraUUID;
};

/**
 * @class BaseFormat
 * @brief FileFormat基类
 * @note
 * **工作流程**
 * 1. 构造对象
 * 2. 调用`Start()`开启存储流程
 * 3. 循环调用`FileSaveFuncCall()`存储图片
 * 4. 调用`Stop()`停止存储图片
 * 5. 调用析构函数
 */
class BaseFormat
{
  public:
    /**
     * @brief 开始存储
     * @note
     * 存储形式可以为文件或文件夹，由具体实现决定
     * 附加信息依据实现，可能使用或丢弃
     * @exception std::exception 调用失败，具体形式由实现决定
     *
     * @param savepath 存储路径
     * @param additional 附加信息
     */
    virtual void Start(const std::filesystem::path& savepath,const BaseFormatAdditionalInf& additional)=0;
    /**
     * @brief 存储图片
     * @note 不强制要求存储ImageType中的所有内容，由具体实现决定
     * 
     * @param image 图片数据
     */
    virtual void FileSaveFuncCall(const ImageType& image)=0;
    /**
     * @brief 停止存储图片
     */
    virtual void Stop()=0;
    /**
     * @brief 析构函数
     */
    virtual ~BaseFormat() {};
};

#endif
